通过 Security 实现登录自定义参数和Json请求方式
UsernamePasswordAuthenticationFilter 源码
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 
 | public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username";public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "password";
 
 private String usernameParameter = SPRING_SECURITY_FORM_USERNAME_KEY;
 private String passwordParameter = SPRING_SECURITY_FORM_PASSWORD_KEY;
 private boolean postOnly = true;
 
 
 
 
 public UsernamePasswordAuthenticationFilter() {
 super(new AntPathRequestMatcher("/login", "POST"));
 }
 
 
 
 
 public Authentication attemptAuthentication(HttpServletRequest request,
 HttpServletResponse response) throws AuthenticationException {
 if (postOnly && !request.getMethod().equals("POST")) {
 throw new AuthenticationServiceException(
 "Authentication method not supported: " + request.getMethod());
 }
 
 String username = obtainUsername(request);
 String password = obtainPassword(request);
 
 if (username == null) {
 username = "";
 }
 
 if (password == null) {
 password = "";
 }
 
 username = username.trim();
 
 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
 username, password);
 
 
 setDetails(request, authRequest);
 
 return this.getAuthenticationManager().authenticate(authRequest);
 }
 
 | 
通过重写attemptAuthentication 实现自定义参数
新建自定义过滤器
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 
 | public class UserLoginAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
 private static final Logger LOGGER = LoggerFactory.getLogger(UserAuthenticationManager.class);
 
 @Reference(version = "1.0")
 private UserService userService;
 
 @Override
 public Authentication attemptAuthentication(HttpServletRequest request,
 HttpServletResponse response) throws AuthenticationException {
 System.out.println("UserLoginAuthenticationFilter --> attemptAuthentication");
 
 if (!request.getMethod().equals("POST")) {
 throw new AuthenticationServiceException(
 "Authentication method not supported: " + request.getMethod());
 }
 LoginRequest loginRequest = builderLoginRequest(request);
 TeResponse resp = userService.login(loginRequest);
 if (!resp.isStatus()) {
 throw new BadCredentialsException(resp.getMessage()+"="+resp.getStatusCode());
 }
 
 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
 loginRequest.getAccount(), BCrypt.hashpw(loginRequest.getPassword(), BCrypt.gensalt()));
 
 setDetails(request, authRequest);
 return this.getAuthenticationManager().authenticate(authRequest);
 }
 
 
 
 
 @SuppressWarnings("unchecked")
 private LoginRequest builderLoginRequest(HttpServletRequest request){
 if(request.getContentType().equals(MediaType.APPLICATION_JSON_UTF8_VALUE)
 ||request.getContentType().equals(MediaType.APPLICATION_JSON_VALUE)){
 ObjectMapper mapper = new ObjectMapper();
 try (InputStream is = request.getInputStream()){
 Map<String,String> map = mapper.readValue(is, Map.class);
 return getLoginRequest(map);
 }catch (IOException e) {
 LOGGER.error("builderLoginRequest error-->",e);
 throw new BadCredentialsException("请求格式异常=1003");
 }
 }
 else{
 return getLoginRequest(request);
 }
 }
 
 
 
 
 
 private LoginRequest getLoginRequest(HttpServletRequest request){
 LoginRequest loginRequest = new LoginRequest();
 loginRequest.setUuid(request.getParameter(USER_UUID_KEY));
 loginRequest.setVerifyCode(request.getParameter(USER_VERIFY_CODE_KEY));
 loginRequest.setAccount(request.getParameter(USER_ACCOUNT_KEY));
 loginRequest.setPassword(request.getParameter(USER_PASSWORD_KEY));
 return loginRequest;
 }
 
 
 
 
 private LoginRequest getLoginRequest(Map<String,String> parameters ){
 LoginRequest loginRequest = new LoginRequest();
 loginRequest.setUuid(parameters.get(USER_UUID_KEY));
 loginRequest.setVerifyCode(parameters.get(USER_VERIFY_CODE_KEY));
 loginRequest.setAccount(parameters.get(USER_ACCOUNT_KEY));
 loginRequest.setPassword(parameters.get(USER_PASSWORD_KEY));
 return loginRequest;
 }
 
 | 
WebSecurityConfig 配置
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 
 | @Configuration@EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
 private static String[] pathArray = new String[]{
 "/user/captcha/base64Code","/user/forget/password"
 };
 
 @Autowired
 private UserAuthenticationManager userAuthenticationManager;
 
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 
 http.cors().configurationSource(getSource());
 http.csrf().disable();
 
 http.authorizeRequests()
 .antMatchers(pathArray).permitAll()
 .anyRequest().authenticated();
 
 http.addFilterAt(userLoginAuthenticationFilter(),UsernamePasswordAuthenticationFilter.class);
 
 
 http.logout()
 .logoutUrl("/logout")
 .deleteCookies("JSESSIONID")
 .invalidateHttpSession(true)
 .logoutSuccessHandler(logoutSuccessHandler())
 .permitAll();
 
 http.exceptionHandling()
 .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint())
 .accessDeniedHandler(accessDeniedHandler());
 }
 
 @Bean
 UserLoginAuthenticationFilter userLoginAuthenticationFilter(){
 UserLoginAuthenticationFilter filter = new UserLoginAuthenticationFilter();
 filter.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/user/login", "POST"));
 filter.setAuthenticationFailureHandler(failureHandler());
 filter.setAuthenticationSuccessHandler(authSuccessHandler());
 filter.setAuthenticationManager(userAuthenticationManager);
 return filter;
 }
 
 private UrlBasedCorsConfigurationSource getSource() {
 CorsConfiguration configuration = new CorsConfiguration();
 String corsAllowedOrigins = "http://127.0.0.1:20880,http://127.0.0.1:20881";
 configuration.setAllowedOrigins(Arrays.asList(corsAllowedOrigins.split(",")));
 String corsAllowedMethod = "POST, GET, OPTIONS";
 configuration.setAllowedMethods(Arrays.asList(corsAllowedMethod.split(",")));
 configuration.applyPermitDefaultValues();
 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
 String corsPath = "/**";
 source.registerCorsConfiguration(corsPath, configuration);
 return source;
 }
 
 @Override
 public void configure(WebSecurity web) throws Exception {
 web.securityInterceptor(new SecurityInterceptor());
 }
 
 @Bean
 AuthenticationSuccessHandler authSuccessHandler() {
 return new UserAuthenticationHandler();
 }
 
 @Bean
 AuthenticationFailureHandler failureHandler() {
 return new UserAuthenticationFailureHandler();
 }
 
 @Bean
 LogoutSuccessHandler logoutSuccessHandler() {
 return new UserLogoutSuccessHandler();
 }
 
 @Bean
 AccessDeniedHandler accessDeniedHandler() {
 return new UserAccessDeniedHandler();
 }
 }
 
 |